package ThreadingSafety;

import java.util.concurrent.Semaphore;

/**
 *  信号量 semaphore [Java标准库中已经包装好了]
 *  信号量这个概念是一个大佬,迪杰斯特拉提出来的. --> 求图的最短路径~
 *
 * 信号量的基本操作是两个:
 * P操作, 申请一个资源
 * V操作. 释放一个资源
 *
 * 信号量本身是一个计数器~~表示可用资源的个数:
 * Р操作申请一个资源,可用资源数就-1
 * V操作释放一个资源,可用资源数就＋1
 * 当计数为О的时候，继续Р操作，就会产生阻塞.阻塞等待到其他线程V操作了为止~~
 *
 * 信号量可以视为是一个更广义的锁！
 * 互斥锁就是一个特殊的信号量(可用资源只有1的信号量, 取值只有1 或者0, 因此也叫 二元信号量)
 *
 * 当需求中, 就是有多个可用资源的时候,就要记得使用信号量~~
 */
public class TestDemo30 {
    public static void main(String[] args) throws InterruptedException {
        // 可用资源为4的信号量.
        Semaphore semaphore = new Semaphore(4);

        // P操作, 申请一个资源, 计数器 - 1.
        semaphore.acquire();
        System.out.println("P 操作");
        semaphore.acquire();
        System.out.println("P 操作");
        semaphore.acquire();
        System.out.println("P 操作");
        semaphore.acquire();
        System.out.println("P 操作");
        // 将在此阻塞
        semaphore.acquire();
        System.out.println("P 操作");

        // V 操作, 释放一个资源, 计数器 + 1.
        semaphore.release();
        System.out.println("V 操作");
    }
}
